from collections import deque


def search(lines, pattern, history=5):
    """
    在文本行中搜索包含特定模式的行，并返回该行及其前面的若干行历史记录。

    Args:
        lines: 可迭代的文本行
        pattern: 要搜索的模式字符串
        history: 保留的历史行数，默认为5

    Yields:
        tuple: (匹配的行, 前几行的deque对象)
    """
    # 创建一个固定长度的双端队列，用于存储历史行
    previous_lines = deque(maxlen=history)
    
    # 遍历每一行文本
    for line in lines:
        # 如果当前行包含指定模式
        if pattern in line:
            # 生成匹配行和历史行的元组
            yield line, previous_lines
        # 将当前行添加到历史记录中
        previous_lines.append(line)


# 示例用法
if __name__ == '__main__':
    # 打开文件进行搜索
    with open('somefile.txt') as f:
        # 搜索包含'python'的行，同时获取前5行历史
        for line, prevlines in search(f, 'python', 5):
            # 打印历史行
            for pline in prevlines:
                print(pline, end='')
            # 打印匹配行
            print(line, end='')
            # 分隔线
            print('-' * 20)